/*
 * SPDX-FileCopyrightText: 2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

@file:OptIn(ExperimentalUnsignedTypes::class)

package com.sanji.audio_test.format

import android.media.MediaFormat
import java.io.FileDescriptor

/**
 * AMR-NB (自适应多速率窄带) 音频格式实现类
 * 
 * AMR-NB 是一种专为语音编码设计的音频格式，采样率为 8kHz，
 * 支持多种比特率，适用于语音通话录音等场景。
 */
class AmrNbFormat : Format() {
    /** 格式名称 */
    override val name: String = "AMR-NB"
    
    /** 容器 MIME 类型 */
    override val mimeTypeContainer: String = "audio/amr"
    
    /** 音频 MIME 类型 */
    override val mimeTypeAudio: String = MediaFormat.MIMETYPE_AUDIO_AMR_NB
    
    /** 是否支持直通模式 */
    override val passthrough: Boolean = false
    
    /** 
     * AMR-NB 格式参数信息
     * 
     * AMR-NB 支持的比特率范围为 4,750 到 12,200 比特/秒
     * 默认比特率为 12,200 比特/秒
     * 实际支持的比特率包括: 4,750, 5,150, 5,900, 6,700, 7,400, 7,950, 10,200, 12,200 比特/秒
     * 当前只列出部分常用比特率作为示例
     */
    override val paramInfo: FormatParamInfo = RangedParamInfo(
        RangedParamType.Bitrate,
        4_750u..12_200u,
        12_200u,
        // AMR-NB 仅支持 8 种可能的比特率。如果用户选择的比特率不是这 8 种之一，
        // Android 系统将回退到 7950 比特/秒。
        uintArrayOf(
            4_750u,
            7_950u,
            12_200u,
        ),
    )
    
    /** 
     * 采样率信息
     * 
     * AMR-NB 标准采样率为 8kHz
     */
    override val sampleRateInfo: SampleRateInfo =
        SampleRateInfo.fromCodec(baseMediaFormat, 8_000u)

    /**
     * 更新媒体格式参数
     * 
     * @param mediaFormat 媒体格式对象
     * @param param 指定的比特率参数
     */
    override fun updateMediaFormat(mediaFormat: MediaFormat, param: UInt) {
        mediaFormat.apply {
            val channelCount = getInteger(MediaFormat.KEY_CHANNEL_COUNT)
            // 设置比特率，需要乘以声道数
            setInteger(MediaFormat.KEY_BIT_RATE, param.toInt() * channelCount)
        }
    }

    /**
     * 创建 AMR 容器实例
     * 
     * @param fd 文件描述符
     * @return AmrContainer 实例 (窄带模式)
     */
    override fun getContainer(fd: FileDescriptor): Container = AmrContainer(fd, false)
}